/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package backing;


import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.Application;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UICommand;
import javax.faces.component.UIOutput;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import logic.CustomerManagerLocal;
import persistence.Account;


/**
 *
 * @author asbriglio
 * backing bean liée à la page MemberList.jsp
 * scope request
 * dans la méthode init on a implémenté une solution basique de sécurité pour empêcher des utilisateurs non
 * authentifiés d'accéder à la page memberList.xhtml. C'est une solution peu élégante car elle n'est pas factorisée
 * et chaque page "sécurisée" devrait être liée à un backing bean  contenant ce code de vérification.
 * A noter que JSF permet de  gérér la sécurité (authentification et authorisation) via le conteneur ou via l'application. Mais celà n'est pas au programme
 * l'objectif est ici de vous faire manipuler des objets implicites tels le FacesContext.
 * dans le fichier web.xml on a déclaré une contrainte de sécurité (commentée) pour interdire l'accés direct à memberList.xhtml.
 * Pour tester commenter le code d'authentification ci-dessous et décommentez dans web.xml
 */

@ManagedBean(name="memList_backing")
@RequestScoped
public class MemberList {

    @EJB
    private CustomerManagerLocal customerManagerBean;

   private List<Account> accounts;

    //composant out utilise la liaison de composant (par opposition à la liaison de valeur => value="")
    //pour établir une association  avec le composant UIOutputText déclaré dans la page memberList.xhtml
    private UIOutput out;

    /** Creates a new instance of MemberList */
    public MemberList() {
        //rappel l'injection à lieu aprés l'instanciation du bean managé
    }

    //annotation commune utilisable par un beam managé JSF
    @PostConstruct
    void init(){
        //on vérifie que l'utilisateur est authentifié et autorisé à accéder à la ressource
       FacesContext ctx = FacesContext.getCurrentInstance(); //contexte de la requête en cours
      ExternalContext extCtx = ctx.getExternalContext();//contexte pour accéder aux éléments de la requête et de la réponse
        Map currentSession=extCtx.getSessionMap();//map représentant la session en cours
        String auth=(String) currentSession.get("Auth_");//on récupère la valeur associée à la clé Auth


      if(auth==null||(!auth.equals("authorized")))
      {
          //si l'utilisateur n'est pas autorisé on redirige vers la page failure.xhtml
          Application app= ctx.getApplication();//retourne la représentation de l'application
          //le gestionnaire de navigation est central dans le modèle de navigation JSF.
          //ici vous invoquer explicitement la méhode qui permet la nvaigation entre page.
          //en coulisse c'est ce qui se passe sans que vous interveniez quand vous utilsez les méthodes d'action retournant une chaîne de navigation.
          //un Navigationhandler est assigné à chaque requête et compare les règles  du fichier XML de navigation
          //avec les paramètres passés à handleNavigation. Et ainsi détermine vers quelle vue naviguer
          //ici on redirige vers failure.xhtml
          app.getNavigationHandler().handleNavigation(ctx,null,"denied");//cf. faces-config.xml
          ctx.responseComplete(); //le cycle de vie est avortée. la réponse est retournée au client

        }else{
       accounts=  customerManagerBean.retrieveAllAccounts();
       }
    }

    public void retrieveDetail(ActionEvent ae){
       UICommand cLink=(UICommand) ae.getComponent();//on récupère le composant source de l'évènement
       String login =(String) cLink.getValue();//on récupère la valeur assignée
       Account acc =customerManagerBean.retrieveMemberByLogin(login);
       String detail = acc.getIdentityInfo().getFirstname()+" "+acc.getIdentityInfo().getLastname()
               +" "+acc.getIdentityInfo().getDob();
       out.setValue(detail);//on assigne detail au composant out
    }

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;

    }

    
    public UIOutput getOut() {
        return out;
    }

    public void setOut(UIOutput out) {
        this.out = out;
    }


}
